package com.it.you.base.stream;

import cn.hutool.core.date.DateUtil;
import com.it.you.pojo.Student;
import lombok.SneakyThrows;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

public class StreamTest1 {

    @SneakyThrows
    public static void main(String[] args) {

        List<Student> students = new ArrayList<>();
        Student s1 = new Student("you", 30, new Date(DateUtil.parseDate("1992-06-19").getTime()), "武汉", new BigDecimal("50000000"));
        Student s2 = new Student("ma", 28, new Date(DateUtil.parseDate("1994-03-14").getTime()), "运城", new BigDecimal("20000000"));
        Student s3 = new Student("gui", 56, new Date(DateUtil.parseDate("1965-10-14").getTime()), "黄陂", new BigDecimal("20000000"));
        Student s4 = new Student("ti", 57, new Date(DateUtil.parseDate("1964-08-03").getTime()), "武汉", new BigDecimal("40000000"));

        students.add(s1);
        students.add(s2);
        students.add(s3);
        students.add(s4);

        //将list中的对象 指定属性转为map 的 key-value
        Map<String, Integer> nameAndAgeMap = students.stream().collect(Collectors.toMap(Student::getName, Student::getAge));
        System.out.println(nameAndAgeMap);

        //Map 的 value 为对象本身时，可以这样写
        //Function.identity()
        //返回一个输出跟输入一样的Lambda表达式对象，等价于形如t -> t形式的Lambda表达式。
        Map<String, Student> nameAndObjectMap = students.stream().collect(Collectors.toMap(Student::getName, t -> t));
        System.out.println(nameAndObjectMap);

        //Collectors.toMap 有三个重载方法：
        //toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper);
        //toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction);
        //toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);

        //keyMapper：Key 的映射函数

        //valueMapper：Value 的映射函数

        //mergeFunction：当 Key 冲突时，调用的合并方法，因为map的key不能重复 （v1,v2)->v1 当map的key出现重复的时候，我们取第一个key和value作为基准，忽略相同的情况。
        //(v1, v2) -> v2，很明显，这样的意思就是：当map的key出现重复的时候，我们取第2个key和value作为基准，忽略相同的情况;

        //mapSupplier：Map 构造器，在需要返回特定的 Map 时使用

        //收集address数据 并将重复数据删除 distinct()
        List<String> stringList = students.stream().map(Student::getAddress).distinct().collect(Collectors.toList());
        System.out.println(stringList);

        List<Student> collect = students.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
        System.out.println(collect);

        String a = "买一瓶送一瓶，多买多送";
        System.out.println(a.substring(0,11));
        System.out.println(a.substring(0,11).length()
        );
    }
}
